抱歉,今天太累了,腦袋昏沉沉的,快速地寫完一個矩形就快睡著了 (~O~),所以今天的內容會非常短...
OpenGL的底層是一個狀態機!
忘記是從哪邊找到的,但這句話對我來說,間接了解了為什麼OpenGL的AP會是長這樣。
最好理解的這句話的就是看OpenGL1.1的API,如果要話一個圖形的話,會是這樣寫(沒記錯的話):
glBegin(GL_NICE_SHAPE);
// set the positons, color data here...
glEnd();
就像這樣,一層層設定,最後在glEnd
的時候繪出,雖說我使用的是OpenGL3,但也沒有改變他的架構。
下面直接先貼上一段code:
// the first rectangle...
static const float VERTICES[] = {
0.5f, 0.5f, // top right
0.5f, -0.5f, // bottom right
-0.5f, -0.5f, // bottom left
-0.5f, 0.5f, // top left
};
static const unsigned int INDICES[] = {
0, 1, 3,
1, 2, 3
};
unsigned int vbo, vao, ibo;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(VERTICES), VERTICES, GL_STATIC_DRAW);
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(INDICES), INDICES, GL_STATIC_DRAW);
glVertexAttribPointer(RENDER_2D_CONTEXT.default_shader.attribs_locations[SHADER_ATTRIB_VEC2_POS], 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*)0);
glEnableVertexAttribArray(RENDER_2D_CONTEXT.default_shader.attribs_locations[SHADER_ATTRIB_VEC2_POS]);
glUseProgram(RENDER_2D_CONTEXT.default_shader.id);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
這個片段其實就是在實作:
如何產生Buffer存儲頂點資料(Vertex Buffer Object)與頂點的繪畫順序(Element Buffer Object) -> 綁定資料
-> 驅動Shader -> 畫在螢幕上。
這邊就直接把程過貼上來了,沒多餘的力氣講解我最甚麼了